package cl.solidit.geomanagement.web.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import cl.solidit.geomanagement.persistance.PersonaDAO;
import cl.solidit.geomanagement.persistance.PropiedadDAO;
import cl.solidit.geomanagement.persistance.UserDAO;
import cl.solidit.geomanagement.persistance.model.Persona;
import cl.solidit.geomanagement.persistance.model.Propiedad;
import cl.solidit.geomanagement.persistance.model.TipoPropiedad;
import cl.solidit.geomanagement.persistance.model.Usuario;
import cl.solidit.geomanagement.web.service.RegisterPropertyService;

@Controller
public class ActualizarPropiedadController {

	@Autowired
	PropiedadDAO propiedadDAO;
	@Autowired
	PersonaDAO personaDAO;
	@Autowired
	UserDAO userDAO;
	@Autowired
	RegisterPropertyService registerPropertyService;

	@RequestMapping(value = "/actualizar_georeferencia/{idPropiedad}", method = RequestMethod.GET)
	@Transactional
	public ModelAndView acceso(@PathVariable Long idPropiedad) {

		Propiedad propiedad = propiedadDAO.consultarPropiedad(idPropiedad);
		List<Propiedad> listaPropiedadesSinGeoref = propiedadDAO
				.findPropiedadSinGeoreferencia();
		List<Propiedad> listaPropiedadesConGeoref = propiedadDAO
				.findPropiedadConGeoreferencia();
		List<Persona> selectAllPerson = personaDAO.selectAllPersonas();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("listaPropiedadesSinGeoref", listaPropiedadesSinGeoref);
		map.put("listaPropiedadesConGeoref", listaPropiedadesConGeoref);
		Hibernate.initialize(propiedad.getComuna());
		Hibernate.initialize(propiedad.getTipoPropiedad());
		Hibernate.initialize(propiedad.getPropietario());
		map.put("propiedad", propiedad);
		map.put("selectAllPerson", selectAllPerson);
		map.put("command", propiedad);
		List<Usuario> listaAgentes = userDAO.traerAgentes();
		map.put("listaAgentes", listaAgentes);
		for (Usuario a : listaAgentes) {
			Hibernate.initialize(a.getPersona());
			return new ModelAndView("actualizar_georeferencia", map);
		}
		return new ModelAndView("actualizar_georeferencia", map);
	}

	@RequestMapping(value = "/actualizar_georeferencia", method = RequestMethod.GET)
	@Transactional
	public ModelAndView acceso() {
		List<Propiedad> listaPropiedadesSinGeoref = propiedadDAO
				.findPropiedadSinGeoreferencia();
		List<Propiedad> listaPropiedadesConGeoref = propiedadDAO
				.findPropiedadConGeoreferencia();
		List<Persona> selectAllPerson = personaDAO.selectAllPersonas();
		if (listaPropiedadesSinGeoref.size() == 0)
			return new ModelAndView("actualizar_georeferencia_empty");
		Propiedad propiedad = listaPropiedadesSinGeoref.get(0);
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("listaPropiedadesSinGeoref", listaPropiedadesSinGeoref);
		map.put("listaPropiedadesConGeoref", listaPropiedadesConGeoref);
		Hibernate.initialize(propiedad.getComuna());
		Hibernate.initialize(propiedad.getTipoPropiedad());
		Hibernate.initialize(propiedad.getPropietario());
		map.put("propiedad", propiedad);
		map.put("selectAllPerson", selectAllPerson);
		map.put("command", propiedad);
		List<Usuario> listaAgentes = userDAO.traerAgentes();
		map.put("listaAgentes", listaAgentes);
		for (Usuario a : listaAgentes) {
			Hibernate.initialize(a.getPersona());
		}
		return new ModelAndView("actualizar_georeferencia", map);
	}

	@Transactional
	@RequestMapping(value = "actualizar_georeferencia", method = RequestMethod.POST)
	public ModelAndView actualizarPropiedad(
			@ModelAttribute("command") Propiedad propiedad) {
		registerPropertyService.registrarPropiedad(propiedad);
		return acceso();
	}
	@RequestMapping(value = "/actualizar_propiedad", method = RequestMethod.GET)
	@Transactional
	public ModelAndView updateProperty() {

		List<Propiedad> listaPropiedades = propiedadDAO
				.findAllPropertys();
		List<Persona> selectAllPerson = personaDAO.selectAllPersonas();
		List<Usuario> listaAgentes = userDAO.traerAgentes();
		List<TipoPropiedad> listaTipoPropiedad = propiedadDAO.traerTipoPropiedad();
		Propiedad propiedad = listaPropiedades.get(0);
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("listaPropiedades", listaPropiedades);
		Hibernate.initialize(propiedad.getComuna());
		Hibernate.initialize(propiedad.getTipoPropiedad());
		Hibernate.initialize(propiedad.getPropietario());
		map.put("propiedad", propiedad);
		map.put("selectAllPerson", selectAllPerson);
		map.put("command", propiedad);
		map.put("listaAgentes", listaAgentes);
		map.put("listaTipoPropiedad", listaTipoPropiedad);
		for (Usuario a : listaAgentes) {
			Hibernate.initialize(a.getPersona());
		}
		return new ModelAndView("actualizar_propiedad", map);
	}
	
	@RequestMapping(value = "/actualizar_propiedad/{idPropiedad}", method = RequestMethod.GET)
	@Transactional
	public ModelAndView updatePropertyNum(@PathVariable Long idPropiedad) {

		Propiedad propiedad = propiedadDAO.consultarPropiedad(idPropiedad);
		List<Propiedad> listaPropiedades = propiedadDAO
				.findAllPropertys();
		
		List<Persona> selectAllPerson = personaDAO.selectAllPersonas();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("listaPropiedades", listaPropiedades);
		Hibernate.initialize(propiedad.getComuna());
		Hibernate.initialize(propiedad.getTipoPropiedad());
		Hibernate.initialize(propiedad.getPropietario());
		map.put("propiedad", propiedad);
		map.put("command", propiedad);
		map.put("selectAllPerson", selectAllPerson);
		List<Usuario> listaAgentes = userDAO.traerAgentes();
		map.put("listaAgentes", listaAgentes);
		List<TipoPropiedad> listaTipoPropiedad = propiedadDAO.traerTipoPropiedad();
		map.put("listaTipoPropiedad", listaTipoPropiedad);
		for (Usuario a : listaAgentes) {
			Hibernate.initialize(a.getPersona());
			return new ModelAndView("actualizar_propiedad", map);
		}
		
		return new ModelAndView("actualizar_propiedad", map);
	}
	
	@Transactional
	@RequestMapping(value = "actualizar_propiedad", method = RequestMethod.POST)
	public ModelAndView actualizarPropiedadPost(
			@ModelAttribute("command") Propiedad propiedad) {
		registerPropertyService.registrarPropiedad(propiedad);
		return updateProperty();
	}
}
